package studia.figlewicz.math.library;

import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ProjekcjaModelu {
	
	
	public ProjekcjaModelu(Model model) {
		this.model = model;
		this.inicjalizujProjekcjeZmiennychObjasnianych(model);
	}
	
	private void inicjalizujProjekcjeZmiennychObjasnianych(Model model) {
		for (String nazwaZmiennej : model.getNazwyZmiennychObjasnianych()) {
			projekcjeZmiennych.add(new ProjekcjaZmiennejObjasnianej(nazwaZmiennej));
		}
	}
	
	private Model model;
	public Model getModel() {
		return model;
	}
	public void setModel(Model model) {
		this.model = model;
	}
	
	
	private Set<ProjekcjaZmiennejObjasnianej> projekcjeZmiennych = new HashSet<ProjekcjaZmiennejObjasnianej>();
	public Set<ProjekcjaZmiennejObjasnianej> getProjekcjeZmiennych() {
		return projekcjeZmiennych;
	}
	public void setProjekcjeZmiennych(
			Set<ProjekcjaZmiennejObjasnianej> projekcjeZmiennych) {
		this.projekcjeZmiennych = projekcjeZmiennych;
	}
	public ProjekcjaZmiennejObjasnianej getProjekcjaZmiennejObjasnianej(String nazwaZmiennej) {
		ProjekcjaZmiennejObjasnianej resoult = null;
		for (ProjekcjaZmiennejObjasnianej pzo : projekcjeZmiennych) {
			if (pzo.getZmiennaObjasniana().equals(nazwaZmiennej)) {
				resoult = pzo;
				break;
			}
		}
		return resoult;
	}
	public Map<String, TrajektoriaProcesu> getTrajektorieProjekcji() {
		Map<String, TrajektoriaProcesu> resoult = new HashMap<String, TrajektoriaProcesu>();
		for (ProjekcjaZmiennejObjasnianej pzo : projekcjeZmiennych) {
			resoult.put(pzo.getZmiennaObjasniana(), pzo.getTrajektoriaProcesu());
		}
		return resoult;
	}
	
	public Map<String, Double> wyznaczProjekcjeModelu(Date krokProjekcji) {
		Map<String, Double> resoult = new HashMap<String, Double>();
		Map<String, TrajektoriaProcesu> dotychczasoweTrajektorie = getTrajektorieProjekcji();
		resoult = model.wyznaczKrokProjekcji(krokProjekcji,dotychczasoweTrajektorie);
		return resoult;
	}
	public void inicjalizujProjekcjeModelu(Date poczatekSymulacji) {
		model.inicjalucujProjekcje(poczatekSymulacji);

	}
	
	public void zapiszWynikProjekcjiModelu(Map<String, Double> krokiProjekcji, Date dataPunktu) {
		for (String zmienna : krokiProjekcji.keySet()) {
			PunktTrajektorii pt = new PunktTrajektorii(dataPunktu,krokiProjekcji.get(zmienna));
			
			getProjekcjaZmiennejObjasnianej(zmienna).getTrajektoriaProcesu().dodajPunktTrajektorii(pt);
		}
	}
	
	public void archiwizujWynikiProjekcjiModelu(MagazynMonteCarlo magazyn, int numerSymulacji) {
		Map<String, TrajektoriaProcesu> wynikiSymulacji = getTrajektorieProjekcji();
		magazyn.archiwizujTrajektorie(model, wynikiSymulacji, numerSymulacji);
	}
	public void resetujWynikiProjekcjiModelu() {
		for (ProjekcjaZmiennejObjasnianej pzo : projekcjeZmiennych) {
			pzo.resetTrajektoriaProcesu();
		}
	}
	
}

